#include "TinyJson.h"
#define assertEq(a, b) assert(a == b)

int main() {
    using namespace tinyUtil;
    std::string s = R"({
    "typeNull" : null,
    "typeTrue" : true,
    "typeFalse" : false,
    "typeStr" : "hello, world",
    "typeNum" : 10086,
    "typeArray" : [null, true, false, "1", 2, [3]],
    "typeObject" : {
        "typeNull" : null,
        "typeTrue" : true,
        "typeFalse" : false,
        "typeStr" : "hello, world",
        "typeNum" : 10086,
        "typeArray" : [null, true, false, "1", 2, [3]]
    }
})";
    std::shared_ptr<JsonObject> jsonPtr = JsonObjectFactory(s).createJsonObj();
    const JsonObject& json = *jsonPtr;
    assert(json.getNode("typeNull").isNull());
    assertEq(json.getBoolValue("typeTrue"), true);
    assertEq(json.getBoolValue("typeFalse"), false);
    assertEq(json.getStrValue("typeStr"), "hello, world");
    assertEq(json.getNumValue("typeNum"), 10086);

    const JsonArray& jsonArray = json.getArrayValue("typeArray");
    assert(jsonArray.getNode(0).isNull());
    assertEq(jsonArray.getBoolValue(1), true);
    assertEq(jsonArray.getBoolValue(2), false);
    assertEq(jsonArray.getStrValue(3), "1");
    assertEq(jsonArray.getNumValue(4), 2);
    assertEq(jsonArray.getArrayValue(5).getNumValue(0), 3);

    const JsonObject& subJson = json.getObjectValue("typeObject");
    assert(subJson.getNode("typeNull").isNull());
    assertEq(subJson.getNode("typeTrue").getValueAsBool(), true);
    assertEq(subJson.getNode("typeFalse").getValueAsBool(), false);
    assertEq(subJson.getNode("typeStr").getValueAsStr(), "hello, world");
    assertEq(subJson.getNode("typeNum").getValueAsNum(), 10086);
}
